<?php
/**
 * Classes base para criação da aplicação
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	base
 * @category	oop
 * @license		http://opensource.org/licenses/gpl-license.php GNU Public License
 */
namespace rpo\base;

use \stdClass;
use \ReflectionClass;

/**
 * Objeto base para todos os objetos da aplicação
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	base
 * @category	oop
 * @license		http://opensource.org/licenses/gpl-license.php GNU Public License
 */
class Object {
	/**
	 * Contagem de objetos da aplicação
	 * @access private
	 * @staticvar
	 * @var integer
	 */
	static private $count = 0;

	/**
	 * Armazenamento de dados dos objetos
	 * @var stdClass $storage
	 * @access private
	 */
	private $storage;

	/**
	 * Constroi um novo objeto
	 * @param mixed $object
	 */
	public function __construct(){
		$this->storage			= new stdClass();
		$this->storage->count	= ++self::$count;
		gc_enable();
	}

	/**
	 * Clona o objeto
	 */
	public function __clone(){
		$this->storage			= clone $this->storage;
		$this->storage->count	= ++self::$count;

	}

	/**
	 * Destroi o objeto
	 */
	public function __destruct(){
		$this->storage = null;
		gc_collect_cycles();
	}

	/**
	 * Retorna a representação do objeto como string
	 * @return string
	 */
	public function __toString(){
		return sprintf( '%s@%s' , $this->getClass()->getName() , $this->hashCode() );
	}

	/**
	 * Compara a igualdade entre dois objetos
	 * @param Object $object
	 */
	public function equals( Object $object ){
		return $this->hashCode() == $object->hashCode();
	}

	/**
	 * Retorna a classe do objeto
	 * @return ReflectionClass
	 */
	public function getClass(){
		return new ReflectionClass( get_class( $this ) );
	}

	/**
	 * Retorna o hash do objeto
	 * @return string
	 */
	public function hashCode(){
		return spl_object_hash( $this );
	}
}